package com.warm.spring.mvc.filter;


import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * 过滤器: 依赖 servlet 容器
 *   过滤器是一个实现javax.servlet.Filter接口的Java类
 *   filter的三种典型应用：
 *     1. 可以在filter中根据条件决定是否调用chain.doFilter(request, response)方法，即是否让目标资源执行
 *     2. 在让目标资源执行之前，可以对request\response作预处理，再让目标资源执行
 *     3. 在目标资源执行之后，可以捕获目标资源的执行结果，从而实现一些特殊的功能
 */

/**
 * 实现方式: 1. 过滤器类上加 @WebFilter --> 属性filterName声明过滤器的名称,可选; urlPatterns指定要过滤 的URL模式,也可使用属性value来声明.(指定要过滤的URL模式是必选属性)
 *         2. 自定义配置类 @Bean
 */
@Component
@WebFilter(urlPatterns = "/mvc",filterName = "filterA")
@Order(value = 1)
public class MyFilterA implements Filter {
    /**
     *  Web浏览器 <==> Web服务器 <==> 过滤器 <==> web资源
     */

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //System.out.println(">>>>> filter A init...");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println(">>>>> filter A do...");
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        String requestUri = request.getRequestURI();
        System.out.println(">>>>> requestURI:" + requestUri);
        //调用该方法后，表示过滤器经过原来的url请求处理方法
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {
        //System.out.println(">>>>> filter A destroy...");
    }

}
